package com.ruixi.spring.transaction.service;

import com.ruixi.spring.transaction.mapper.AccountMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service("accountService")
public class AccountServiceImpl implements AccountService{

    @Resource
    private AccountMapper accountMapper;

    /*
     @Transactional:将方法中的所有操作作为一个事务进行管理             事务底层使用的是AOP
	  		在方法上使用,则只对方法有效果
	  		在类上使用,则对类中所有的方法都有效果

	 	 @Transactional中可以设置的属性
	  		propagation(事务的传播级别):A方法和B方法都有事务,当A在调用B时,会将A中的事务传播给B方法,B方法对于事务的处理方式(B是用A的事务,还是用自己的事务)就是事务的传播行为
	  			Propagation.REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行,如上所示即使用A的事务,该值为默认值
	  				例:假设A调用B两次,第一次正常执行而第二次报了异常,当使用REQUIRED时,第二次的异常会使第一次正常执行的代码也进行回滚
	  			Propagation.REQUIRES_NEW:当前的方法必须启动新事务,并在它自己的事务内运行,将调用者的事务挂起,不使用调用者的事务,而是自己创建一个新的事务进行处理
	  				例:假设A调用B两次,第一次正常执行而第二次报了异常,当使用REQUIRES_NEW时,第二次的异常不会使第一次正常执行的代码回滚

	  		isolation(事务的隔离级别):在并发的情况下,操作数据的一种规定,该值可以不设置,如果不设置则默认和数据库的隔离级别是相同的,MySql的默认隔离级别为"可重复读"
	  	 		针对字段	  		Isolation.READ_UNCOMMITTED  读未提交(A事务可以读取到B事务未提交的数据,但如果B事务进行了回滚,那么A事务读取的数据便没有意义):脏读
	  	 		针对字段	  		Isolation.READ_COMMITTED    读已提交(A事务只能读取到B事务已经提交的数据,但如果A事务刚读取完,B事务就提交了事务,那么A事务再次读取时就会发现两次读取的值不一样):不可重复读
	  	 		针对行数据 		Isolation.REPEATABLE_READ   可重复读(A事务当前正在读的已经存在的数据不允许任何的请求对其进行更新操作,但其他事务可以进行新增的操作,则会发现两次读取的值不一样,好像出现了幻觉一样):幻读
	  							Isolation.SERIALIZABLE       串行化(相当于单线程,A事务正常操作的数据,B事务连读都不允许):性能低,消耗大

	  		timeout:在事务强制回滚前最多可以执行(等待)的时间,默认单位为秒,默认值为 -1

	  		readOnly:指定当前事务中的一系列的操作是否为只读,若设置为只读,不管事务中有没有写的操作(即使设置为只读,也是可以有写的操作的),MySql都会在请求访问数据的时候,不加锁,提高性能,但是如果有写操作的情况,一定不能设置只读

	  		设置事务回滚的条件,如果不设置,则只要抛出了异常,就会进行回滚
	  			rollbackFor(对应异常的Class对象)
	  			rollbackForClassName(对应异常的全限定名)
	  			noRollbackFor
	 			noRollbackForClassName
    */

    //转帐
    @Override
    @Transactional
    public void accountMoney() {
        //减钱
        this.accountMapper.descMoney();

        //异常
        int i = 10 / 0;

        //加钱
        this.accountMapper.addMoney();
    }
}
